package n2_common_methods;

import lombok.extern.slf4j.Slf4j;
import utils.Constants;
import utils.FileReader;

/**
 --------------- test1() ------------------------------------------------------------------
 start() 开始 新线程执行  【不会有 提升性能效果】
 run()   依然是main主线程执行

 --------------- test2() ------------------------------------------------------------------
 线程方法 被 start() 方法执行完 ； 状态由 NEW  ===> RUNNABLE （run()方法执行完不会改变）

 --------------- test3() ------------------------------------------------------------------
 线程run()方法可以无限执行； start() 方法 重复执行抛出： java.lang.IllegalThreadStateException
 */
@Slf4j(topic = "c")
public class T1_start_vs_run {

    public static void main(String[] args) {

//        test1();
//        test2();
        test3();
    }

    public static void test1(){
        final Thread t1 = new Thread("t1") {
            @Override
            public void run() {
                log.debug("runing ......");
                FileReader.read(Constants.MP4_FULL_PATH);
            }
        };

        /**
         * ---------------------------------------------------------
         *                                                         /
         *         run()方法 是用主线程调用的，这样将不会提高性能        /
         *                                                         /
         * =========================================================
         */
        /*
        ----------------------  t1.run() -----------------------
        09:57:46.483 [main] c - runing ......
        09:57:46.486 [main] c.FileReader - read [a.mp4] start ...
        09:57:49.296 [main] c.FileReader - read [a.mp4] end ... cost: 2810 ms
        09:57:49.296 [main] c - do other tings ......
         */
        t1.run();
        /*
        ----------------------  t1.start() -----------------------
        09:56:45.805 [main] c - do other tings ......
        09:56:45.805 [t1] c - runing ......
        09:56:45.809 [t1] c.FileReader - read [a.mp4] start ...
        09:56:48.612 [t1] c.FileReader - read [a.mp4] end ... cost: 2803 ms
          */
//        t1.start();
        log.debug("do other tings ......");

    }

    // 线程方法 被 start() 方法执行完 ； 状态由 NEW  ===> RUNNABLE （run()方法执行完不会改变）
    private static void test2(){
        final Thread t1 = new Thread("t1") {
            @Override
            public void run() {
                log.debug("runing ......");
            }
        };

        // 打印状态   21:39:15 [main] c.T2 - ---  状态信息1：NEW
        log.debug("---  状态信息1：" + t1.getState());

//        t1.run();    // 依然是main主体线程执行, 不会改变状态，一直是new
        t1.start(); // 开启新线程

        // 执行 start()完，打印状态   21:39:15 [main] c.T2 - ---  状态信息2：RUNNABLE
        // 执行   run()完，打印状态   21:40:05 [main] c.T2 - ---  状态信息2：NEW
        log.debug("---  状态信息2：" + t1.getState());

    }

    // 线程run()方法可以无限执行； start() 方法不能 会抛异常java.lang.IllegalThreadStateException
    private static void test3(){
        final Thread t1 = new Thread("t1") {
            @Override
            public void run() {
                log.debug("runing ......");
            }
        };

//        t1.run();
//        t1.run();
//        t1.run();
        t1.start();
        t1.start();

    }
}
